1

背景

现在我有这么一个需求:

  • 数据库Auser表需要导入到数据库Baccount

    • user表字段:uid,username,email,password,regdate,salt
    • account表字段:id,name,email,password,type,salt
  • 导入的字段只有username,email,password,salt,并且regdate需要符合某个条件

下面分几种情况来写sql,主要区分insert intoreplace into

情况

导入的数据在B库的表中完全不存在

  • 直接insert into就好,使用replace into效果一样
INSERT INTO `B`.`account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`users`
WHERE regdate>1418313600

导入的数据部分存在

  • 数据部分存在为了区分需要在两个表添加唯一索引,这个唯一索引(UNIQUE)必须是导入的字段里面的值
  • 我在两个表中分别为usernamename字段添加唯一索引

直接替换

  • replace into在操作的时候如果两表数据重复(必须定义UNIQUE),会先删掉那一行(注意是一整行),然后再执行insert into

  • 造成的后果就是,account表中的type字段如果原来有值,会直接删掉,并重新插入,即变成默认值了

REPLACE INTO `B`.`account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`users`
WHERE regdate>1418313600

忽略重复

  • IGNORE关键字,如果遇到重复,不会操作当前行
INSERT IGNORE INTO `B`.`account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`users`
WHERE regdate>1418313600

部分更新

  • 比如果只想更新passwordsalt字段,可以用ON DUPLICATE KEY UPDATE
INSERT INTO `B`.`u_account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`bbs_ucenter_members`
WHERE regdate>1418313600 ON DUPLICATE KEY UPDATE PASSWORD=VALUES(PASSWORD),salt=VALUES(salt)

总结

  • replace into比较暴力,网上也有说慎重使用的,最好用insert into代替

疑问

  • 以上的操作是两个数据库在同一台服务器上的,直接一条sql就可以搞定
  • 假如要导的两个库在不同的两个服务器上要怎么做啊?

    • 目前暂时的办法:
    • A库中的user表导入到B库所在的另一台服务器上,然后写一条sql搞定
    • 或者查询出指定数据,导出sql,在sql中将insert into替换为insert ignore into(有局限性)

参考文献

不同数据库之间数据互导怎么实现?
mysql insert操作
MySQL的Replace into 与Insert into on duplicate key update真正的不同之处
INSERT ... ON DUPLICATE KEY UPDATE Syntax
mysql 将时间戳直接转换成日期时间


savokiss
6.2k 声望4.5k 粉丝

You know nothing, SpongeBob.